package com.yjd.comm.order.service;

import com.yjd.comm.base.enums.DbWREnums;
import com.yjd.comm.base.model.PagerModel;
import com.yjd.comm.base.service.IBaseService;
import com.yjd.comm.enums.OrderRefuseEnum;
import com.yjd.comm.enums.RefundOrderStatus;
import com.yjd.comm.merchant.dto.OrderStatisticDto;
import com.yjd.comm.order.model.ApplyOrderModel;
import com.yjd.comm.order.model.OrderModel;
import com.yjd.comm.order.model.OrderResult;
import com.yjd.comm.order.model.RefundOrderModel;

import java.util.List;
import java.util.Map;

/**
 * <b>description</b>：订单业务接口<br>
 * <b>time</b>：2017-06-27 08:53:50 <br>
 * <b>author</b>：  yangchangyan@yijiedai.com
 */
public interface IOrderService extends IBaseService {
	/**
	 * 插入
	 * 
	 * @param model
	 * @return
	 * @throws Exception
	 */
	public OrderModel insert(OrderModel model) throws Exception;

	/**
	 * 更新,大于等于1表示成功，其他失败
	 * 
	 * @param model
	 * @return
	 * @throws Exception
	 */
	public int update(OrderModel model) throws Exception;

	/**
	 * 更具订单id更新订单信息
	 *
	 * @param order_id
	 * @param curr_version
	 * @param paramMap
	 * @return
	 * @throws Exception
	 */
	public int updateByMap(Long order_id, Long curr_version, Map<Object, Object> paramMap) throws Exception;

	/**
	 * 根据id删除,大于等于1表示成功，其他失败
	 * 
	 * @param order_id
	 * @return
	 * @throws Exception
	 */
	public int delete(long order_id) throws Exception;


	/**
	 * 生成一个新的订单
	 * @param applyOrderModel
	 * @param user_id
	 * @throws Exception
	 */
	public OrderResult generateOrder(ApplyOrderModel applyOrderModel, Long user_id)throws Exception;


	/**
	 * 搜索项目
	 * @param param
	 * @return
	 * @throws Exception
	 */
	public PagerModel getOrderInfoList(Map<String, Object> param) throws Exception;


	/**
	 *  自助取消订单
	 * @param user_id
	 * @param order_id
	 * @throws Exception
	 */
	 public void myselfCanel(Long user_id,Long order_id)throws Exception;


	/**
	 *  商户确认订单
	 * @param org_id
	 * @param order_id
	 * @throws Exception
	 */
	 public void merchantConfirm(Long org_id,Long order_id)throws Exception;

	/**
	 *  商户拒绝订单
	 * @param org_id
	 * @param order_id
	 * @throws Exception
	 */
	public void merchantRefuse(Long org_id, Long order_id,OrderRefuseEnum orderRefuseEnum,String content)throws Exception;

	/**
	 * 订单日结（T+1）
	 * @param previousTime 前一天的时间（单位：秒）
	 * @throws Exception
	 */
	public void settlement(Long previousTime)throws Exception;

	/**
	 * 订单日结（T+1），结算时间[start, end]之间的订单。
	 * @param start 起始时间（单位：秒）
	 * @param end 结束时间（单位：秒）
	 * @throws Exception
	 */
	public void settlement(Long start, Long end)throws Exception;

	/**
	 * 获取退款订单列表
	 *
	 * @param paramMap 查询参数列表
	 * @param write 是否是操作主库
	 * @return 返回结果列表
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public List<RefundOrderModel> queryRefundOrder(Map<String, Object> paramMap, DbWREnums write) throws Exception;

	/**
	 * 查询结算订单
	 *
	 * @param paramMap 查询参数列表
	 * @param write 是否是操作主库
	 * @return 返回结果列表
	 * @throws Exception
	 */
	public List<OrderModel> querySettlementOrder(Map<String, Object> paramMap, long skip, int size, DbWREnums write) throws Exception;

	/**
	 * 退款处理，商户org_id 通过/拒绝 订单order_id的退款申请
	 *
	 * @param org_id 用户id
	 * @param order_id 订单id
	 * @param type 操作类型 1 通过, 2 拒绝
	 * @return 受影响的记录数
	 * @throws Exception
	 */
	public int refundProcess(Long org_id, Long order_id, RefundOrderStatus type,OrderRefuseEnum orderRefuseEnum,String content) throws Exception;


	/**
	 *  首付款成功到账处理
	 * @throws Exception
	 */
	public void firstPaymentSuccess(Long order_id)throws Exception;

	/**
	 * 获取还款订单列表
	 * 如：近七日待还 或 近十五日待还 或 全部待还
	 *
	 * @param paramMap 查询参数列表
	 * @param write 是否是操作主库
	 * @return 返回结果列表
	 * @throws Exception
	 */
	public List<OrderModel> queryRepaymentOrder(Map<String, Object> paramMap, DbWREnums write) throws Exception;

	/**
	 * 更新订单失效状态
	 * @param parmMap
	 * @return
	 * @throws Exception
	 */
	public int updateInvalidOrderStatus(Map<String,Object> parmMap)throws Exception;

	/**
	 *  统计用户的订单情况，如：总订单数，还款中订单数，还款完成订单数，逾期订单数等
	 * @throws Exception
	 */
	public OrderStatisticDto orderStatisticByUser(Long user_id)throws Exception;

	/**
	 * 还款中的订单取消
	 * @param order_id
	 * @throws Exception
	 */
	public void repaymentingOfCannel(Long order_id)throws Exception;
}
